package controllers

import (
	"math/rand"
	"my-yipuku/models"
	"my-yipuku/utils"
	"strconv"
	"time"

	"github.com/gin-gonic/gin"
)

// 定义个LoginController空结构体
type LoginControoler struct{}

// 账号登陆
func (u LoginControoler) Login(c *gin.Context) {
	// 表单验证
	var form struct {
		Phone     string `form:"phone" binding:"required"`   // 手机号
		Paswword  string `form:"password" default: ""`       // 密码
		Code      string `form:"code" default: ""`           // 验证码
		CheckType string `form:"check_type" default: "code"` // 验证方式
	}
	// 验证表单信息
	if err := c.ShouldBind(&form); err != nil {
		ReturnError(c, -200, err.Error())
		return
	}
	// 手机号
	phone := c.PostForm("phone")
	// 密码
	password := c.PostForm("password")
	// 验证码
	code := c.PostForm("code")
	// 验证方式
	check_type := c.PostForm("check_type")
	// 获取用户信息
	user := models.UserByKEY("phone", phone)
	if check_type == "code" {
		// 1.连接redis
		client := utils.Redis{}.Cilent()
		// 2..获取redis中的验证码
		RedisCode, _ := client.Get("login_" + phone).Result()
		// 3.验证手机短信验证码
		if code != RedisCode {
			ReturnError(c, -200, "手机短信验证码不正确，请重新输入！")
			return
		}
		// 3.删除redis中的验证码
		client.Del("login_" + phone).Result()
		// 若用户不存在则进行创建
		if user.Phone == "" {
			var nowTime = time.Now().Unix()
			// 密码转换成MD5字符串
			password = StringToMd5(password)
			user.Phone = phone
			user.Password = password
			user.Status = 1
			user.CouponQuantity = 0
			user.Balance = 0
			user.Login_at = nowTime
			user.CreatedAt = nowTime
			user.UpdatedAt = nowTime
			user.ID = models.CreateUser(user)
		}
	} else if check_type == "password" {
		if user.Phone == "" {
			ReturnError(c, -200, "用户不存在")
			return
		}
		// 密码转换成MD5字符串
		password = StringToMd5(password)
		if user.Password != password {
			ReturnError(c, -200, "密码不正确")
			return
		}
	} else {
		ReturnError(c, -200, "check_type undefined")
		return
	}
	token := utils.MakeToken(user.ID, user.Phone)
	if len(token) == 0 {
		ReturnError(c, -200, "Token生成失败")
		return
	}
	if user.Status == 0 {
		ReturnError(c, -200, "当前账号处于禁用状态，请联系客服进行处理")
		return
	}
	type Data struct {
		Id    int    `json:"id"`
		Token string `json:"token"`
	}
	data := Data{Id: user.ID, Token: token}
	ReturnSuccess(c, 200, "请求成功", data)
	return
}

// 退出登陆
func (u LoginControoler) LoginOut(c *gin.Context) {
	// user, _ := c.Get("user")
	// userID := user.(*utils.MyClaim).ID
	// userPhone := user.(*utils.MyClaim).Phone
	// log.Print("login===========", userID)
	// log.Print("login===========", userPhone)
	ReturnSuccess(c, 200, "注销成功", "")
}

func (u LoginControoler) SendSms(c *gin.Context) {
	phone := c.PostForm("phone")
	if phone == "" {
		ReturnError(c, -200, "手机号不能为空")
		return
	}
	// 1.连接redis
	client := utils.Redis{}.Cilent()
	// 获取当前IP已发送的次数
	UserSendCount, _ := client.Get("login_send_count_" + phone).Result()
	count := 5                                  // 规定时间内容定义发送次数
	sendCount, _ := strconv.Atoi(UserSendCount) // 字符串转整数
	if UserSendCount != "" && sendCount > count {
		ReturnError(c, -200, "规定时间内只能发送5次短信验证码,请稍后重试！")
		return
	}
	// 设置随机数种子
	rand.Seed(time.Now().UnixNano())
	// 生成4位随机数字
	num := rand.Intn(9999) + 1000
	// 放入redis缓存中
	// 2.设置缓存并且设置过期时间为60s
	err := client.Set("login_"+phone, num, 60*time.Second).Err()
	// 发送手机号
	utils.AliyunCode{}.Send(num, phone)
	// log.Println(err)
	// 缓存失败，加入错误日志（未写）
	if err != nil {
		ReturnError(c, -200, "发送失败")
		return
	}
}
